﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace DesignPattern
{
    // 泛型单例模式，只需让类继承该泛型类即可。
    // 由于c#只允许单继承，若想要编写的单例类还要继承其他类，则可以先继承该泛型单例类生成一个中间类
    // 再继承中间类完成继承多个类的目的。但注意中间类的构造函数也要是protected
    class Danli4<T>
    {
        // Activator.CreateInstance是 反射API，即调用T类的默认构造函数（无参、全缺省也属于默认）来创建T的实例
        // 表示要实例化的类型是泛型类型T
        // true表示可以使用非公共的默认构造函数
        private static readonly Lazy<T> instance = new Lazy<T>(() => (T)Activator.CreateInstance(typeof(T), true));

        protected Danli4() { }      // 注意这里是protected，外部无法调用创建实例。但在子类中能访问

        public static T Instance
        {
            get
            {
                return instance.Value;
            }
        }
    }

    class Danli:Danli4<Danli>
    {
        private int count = 0;

        private Danli() { }

        public int Count
        {
            get
            {
                return count;
            }
        }

        public void IncreatCount()
        {
            Interlocked.Increment(ref count);
        }
    }
}
